# 一、选择题
#
# Python中定义私有属性的方法是（D）。
# A.使用private关键字
# B.使用public关键字
# C.使用__XX__定义属性名
# D.使用__XX定义属性名
#
# 2.
# 下列选项中，不属于面向对象程序设计的三个特征的是（A）。
#
# A.抽象
# B.封装
# C.继承
# D.多态
#
# 3.
# 以下C类继承A类和B类的格式中，正确的是（C）。
#
# A.class C A, B:
# B.class C（A:B）
# C.class C（A,B）
# D.class C A and B:
#
# 4.
# 下列选项中，与class Person等价的是（C）。
# A. class Person（Object）
# B.class Person（Animal）
# C. class Person（object）
# D.class Person: object
#
#
# 二、判断题
#
# 继承会在原有类的基础上产生新的类，这个新类就是父类。（F）
# 带有两个下划线的方法一定是私有方法。（F）
# 子类能继承父类的一切属性和方法。（F）
# 子类通过重写继承的方法，覆盖掉跟父类同名的方法。（T）
# 如果类属性和实例属性重名，对象也可以访问类属性的值。（F）
# 使用类名获取到的值一定是类属性的值。（T）
#
# 三、填空题
#
# 如果属性名的前面加上了两个____下划线___，就表明它是私有属性。
# 在现有类基础上构建新类，新的类称作子类，现有的类称作_____父类_______。
# 父类的____私有___属性和方法是不能被子类继承的，更不能被子类访问。
# Python语言既支持单继承，也支持______多_____继承。
# 子类想按照自己的方式实现方法，需要___重写____从父类继承的方法。
# 子类通过____super______可以成功地访问父类的成员。
#
# 四、简答题
#
# 请简述如何保护类的属性。
# 搞成私有属性
# 什么是继承？
# 一个类可以使用另一个类的属性或方法
# 请简述私有属性无法访问的原理。
# python将监测到的私有属性另命名为了其他格式
#
# 五
# 编程题
# 1.简述面向对象中为什么要有继承?
# 减少代码冗余、提高代码复用性
# 2.Python继承时，查找成员的顺序遵循什么规则?
# 经典类中深度优先，新式类中类似广度优先的c3算法

# 3.需求：
# 房子有户型，总面积（私有）和家具名称列表
# 新房子没有任何的家具
#
# 家具有名字和占地面积，其中
# 床：占4平米
# 衣柜：占2平面
# 餐桌：占1 .5平米
#
# 将以上三件家具添加到房子中
# 打印房子时，要求输出: 户型，总面积，剩余面积，家具名称列表
# class Furniture:
#
#     def __init__(self, name, area):
#         self.name = name
#         self.area = area
#
#
# class House:
#
#     def __init__(self, type, area):
#         self.type = type
#         self.__area = area
#         self.free_area = area
#         self.furniture_list = []
#
#     def __str__(self):
#         return ("户型：{}\n总面积：{} 剩余面积：{}\n家具：{}"
#                 .format(self.type, self.__area, self.free_area, self.furniture_list))
#
#     def add_furniture(self, furniture):
#         self.furniture_list.append(furniture.name)
#         self.free_area -= furniture.area
#
#
# bed = Furniture("床", 4)
# wardrobe = Furniture("衣柜", 3)
# table = Furniture("餐桌", 2)
#
# home = House("两室一厅", 60)
#
# home.add_furniture(bed)
# home.add_furniture(wardrobe)
# home.add_furniture(table)
#
# print(home)

# 4.
# 将反射用到的函数整理成笔记，尝试用自己话来描述每个函数的作用
# getattr()如果类或对象中有这个方法或属性，就调用
# hasattr()用作判断类或对象中有没有这个方法或属性，返回bool值
# setattr()给类或对象设置属性
# delattr()删除类或对象中的属性
